#pragma once
#include "Singleton.h"
#include "State.h"

class GoalKeeper;

class GKGlobalState : public State<GoalKeeper>, public Singleton<GKGlobalState>
{
public:
	void Enter(GoalKeeper*);
	void Execute(GoalKeeper*);
	void Exit(GoalKeeper*);
	bool OnMessage(GoalKeeper* , const Telegram&);
};

class GKHoldBall : public State<GoalKeeper>, public Singleton<GKHoldBall>
{
public:
	void Enter(GoalKeeper*);
	void Execute(GoalKeeper*);
	void Exit(GoalKeeper*);
	bool OnMessage(GoalKeeper* , const Telegram&);
};

class GKCatchBall : public State<GoalKeeper>, public Singleton<GKCatchBall>
{
public:
	void Enter(GoalKeeper*);
	void Execute(GoalKeeper*);
	void Exit(GoalKeeper*);
	bool OnMessage(GoalKeeper* , const Telegram&);
};

class GKReceivePass : public State<GoalKeeper>, public Singleton<GKReceivePass>
{
public:
	void Enter(GoalKeeper*);
	void Execute(GoalKeeper*);
	void Exit(GoalKeeper*);
	bool OnMessage(GoalKeeper* , const Telegram&);
};

class GKIdle : public State<GoalKeeper>, public Singleton<GKIdle>
{
public:
	void Enter(GoalKeeper*);
	void Execute(GoalKeeper*);
	void Exit(GoalKeeper*);
	bool OnMessage(GoalKeeper* , const Telegram&);
};

class GKKickOff : public State<GoalKeeper>, public Singleton<GKKickOff>
{
public:
	void Enter(GoalKeeper*);
	void Execute(GoalKeeper*);
	void Exit(GoalKeeper*);
	bool OnMessage(GoalKeeper* , const Telegram&);
};

class GKUserControlled : public State<GoalKeeper>, public Singleton< GKUserControlled>
{
public:
	void Enter(GoalKeeper*);
	void Execute(GoalKeeper*);
	void Exit(GoalKeeper*);
	bool OnMessage(GoalKeeper* , const Telegram&);
};
